home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / util / comm / converse.sit / NSCA Converse / PatientDoctorRelations < prev   
Text File  |  1991-04-02  |  5KB  |  264 lines

  1. unit PatientDoctorRelations;
  2.  
  3. interface
  4.  
  5.     uses
  6.         AppleTalk;
  7.  
  8.     procedure OpenSocket;
  9.     function GetAddress: boolean;
  10.     procedure Talk (s: string);
  11.     procedure StartRead;
  12.     procedure Hear (var s: string);
  13.     procedure CloseSocket;
  14.     procedure GetOutOfHere (i, j: integer);
  15.  
  16. implementation
  17.  
  18.     var
  19.         abRecord, abReadRecord: ABRecHandle;
  20.         RegisterBuffer: ptr;
  21.         address: AddrBlock;
  22.         mySocket: byte;
  23.         myEntity: EntityName;
  24.         ReceiveBuffer: ptr;
  25.  
  26.     procedure GetOutOfHere (i, j: integer);
  27.     begin
  28.         showtext;
  29.         writeln(i, j);
  30.         repeat
  31.         until button;
  32.         exittoshell;
  33.     end;
  34.  
  35.     procedure OpenSocket;
  36.         var
  37.             err: integer;
  38.             UniqueName: integer;
  39.  
  40.     begin
  41.         UniqueName := 0;
  42.  
  43.         mySocket := 0;
  44.         err := DDPOpenSocket(mySocket, nil);
  45.         if err <> 0 then
  46.             getoutofhere(1, err);
  47.  
  48.         abRecord := ABRecHandle(NewHandle(ddpSize));
  49.         if abRecord = nil then
  50.             getoutofhere(2, err);
  51.  
  52.         abReadRecord := ABRecHandle(NewHandle(ddpSize));
  53.         if abReadRecord = nil then
  54.             getoutofhere(3, err);
  55.  
  56.         RegisterBuffer := newptr(200);
  57.         if RegisterBuffer = nil then
  58.             getoutofhere(4, err);
  59.  
  60.         ReceiveBuffer := newptr(250);
  61.         if ReceiveBuffer = nil then
  62.             getoutofhere(5, err);
  63.  
  64.         HLock(handle(abRecord));
  65.  
  66.         repeat
  67.             UniqueName := UniqueName + 1;
  68.             with myEntity do
  69.                 begin
  70.                     objStr := concat('Lucy', StringOf(UniqueName : 1));
  71.                     typeStr := 'Doctor';
  72.                     zoneStr := '*';
  73.                 end;
  74.  
  75.             repeat
  76.                 err := NBPRemove(@myEntity)
  77.             until err <> 0;
  78.  
  79.             with abRecord^^ do
  80.                 begin
  81.                     nbpEntityPtr := @myEntity;
  82.                     nbpBufPtr := RegisterBuffer;
  83.                     nbpBufSize := 200;
  84.                     nbpAddress.aSocket := mySocket;
  85.                     with nbpRetransmitInfo do
  86.                         begin
  87.                             retransInterval := 8;
  88.                             retransCount := 3;
  89.                         end;
  90.                 end;
  91.  
  92.             err := NBPRegister(abRecord, false);
  93.  
  94.         until err <> -1027;  {nbpDuplicate}
  95.  
  96.         HUnLock(handle(abRecord));
  97.  
  98.         if err <> 0 then
  99.             getoutofhere(6, err);
  100.  
  101.     end;
  102.  
  103.     function GetAddress: boolean;
  104.         var
  105.             Entity: EntityName;
  106.             buffer: ptr;
  107.             err: integer;
  108.  
  109.         procedure punt;
  110.         begin
  111.             disposPtr(buffer);
  112.             exit(GetAddress);
  113.         end;
  114.  
  115.     begin
  116.         GetAddress := false;
  117.  
  118.         buffer := newptr(200);
  119.         if buffer = nil then
  120.             exit(GetAddress);
  121.  
  122.         with Entity do
  123.             begin
  124.                 objStr := '=';
  125.                 typeStr := 'Doctor';
  126.                 zoneStr := '*';
  127.             end;
  128.  
  129.         HLock(handle(abRecord));
  130.  
  131.         with abRecord^^ do
  132.             begin
  133.                 abUserReference := 0;
  134.                 nbpEntityPtr := @Entity;
  135.                 nbpBufPtr := buffer;
  136.                 nbpBufSize := 200;
  137.                 nbpDataField := 1;
  138.                 with nbpRetransmitInfo do
  139.                     begin
  140.                         retransInterval := 8;
  141.                         retransCount := 1;
  142.                     end;
  143.             end;
  144.  
  145.         err := NBPLookup(abRecord, false);
  146.         if err <> 0 then
  147.             getoutofhere(7, err);
  148.  
  149.         HUnLock(handle(abRecord));
  150.  
  151.         if abRecord^^.nbpDataField = 0 then
  152.             punt;
  153.  
  154.         if abRecord^^.nbpDataField <> 1 then
  155.             getoutofhere(8, err);
  156.  
  157.  
  158.         err := NBPExtract(buffer, 1, 1, Entity, address);
  159.         if err <> 0 then
  160.             getoutofhere(9, err);
  161.  
  162.         GetAddress := true;
  163.     end;
  164.  
  165.     procedure Talk (s: string);
  166.         var
  167.             err: integer;
  168.  
  169.     begin
  170.  
  171.         HLock(handle(abRecord));
  172.  
  173.         with abRecord^^ do
  174.             begin
  175.                 ddpType := 166;
  176.                 ddpSocket := mySocket;
  177.                 ddpAddress := address;
  178.                 ddpReqCount := length(s);
  179.                 ddpDataPtr := @s[1];
  180.             end;
  181.  
  182.         err := DDPWrite(abRecord, false, false);
  183.         if err <> 0 then
  184.             getoutofhere(10, err);
  185.  
  186.         HUnLock(handle(abRecord));
  187.  
  188.     end;
  189.  
  190.     procedure StartRead;
  191.         var
  192.             err: integer;
  193.     begin
  194.  
  195.         HLock(handle(abReadRecord));
  196.  
  197.         with abReadRecord^^ do
  198.             begin
  199.                 ddpSocket := mySocket;
  200.                 ddpReqCount := 250;
  201.                 ddpDataPtr := ReceiveBuffer;
  202.             end;
  203.  
  204.         err := DDPRead(abReadRecord, false, true);
  205.         if err <> 0 then
  206.             getoutofhere(11, err);
  207.  
  208.         HUnLock(handle(abReadRecord));
  209.  
  210.     end;
  211.  
  212.     procedure Hear (var s: string);
  213.         var
  214.             err: integer;
  215.     begin
  216.  
  217.         HLock(handle(abReadRecord));
  218.  
  219.         if abReadRecord^^.abResult <> 0 then
  220.             getoutofhere(12, err);
  221.  
  222.         if abReadRecord^^.ddpType <> 166 then
  223.             getoutofhere(13, err);
  224.  
  225.         address.aNet := abReadRecord^^.ddpAddress.aNet;
  226.         address.aNode := abReadRecord^^.ddpAddress.aNode;
  227.         address.aSocket := abReadRecord^^.ddpAddress.aSocket;
  228.  
  229.         if (abReadRecord^^.ddpActCount < 0) or (abReadRecord^^.ddpActCount > 200) then
  230.             getoutofhere(18, err);
  231.  
  232.         if abReadRecord^^.ddpActCount = 0 then
  233.             s := ''
  234.         else
  235.             begin
  236.                 s := '01234567890123456789012345678901234567890123456789';        {50 characters}
  237.                 s := concat(s, s, s, s, s);            {250 characters}
  238.                 BlockMove(ReceiveBuffer, @s[1], abReadRecord^^.ddpActCount);
  239.                 s := Copy(s, 1, abReadRecord^^.ddpActCount);
  240.             end;
  241.  
  242.         HUnLock(handle(abReadRecord));
  243.  
  244.     end;
  245.  
  246.     procedure CloseSocket;
  247.         var
  248.             err: integer;
  249.     begin
  250.         err := NBPRemove(@myEntity);
  251.         if err <> 0 then
  252.             getoutofhere(19, err);
  253.  
  254.         err := DDPCloseSocket(mySocket);
  255.         if err <> 0 then
  256.             getoutofhere(20, err);
  257.  
  258.         DisposHandle(handle(abRecord));
  259.         DisposHandle(handle(abReadRecord));
  260.         DisposPtr(RegisterBuffer);
  261.         DisposPtr(ReceiveBuffer);
  262.     end;
  263.  
  264. end.